package com.linq.cool.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.linq.cool.entities.Menu;
import javafx.scene.control.MenuItem;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @Author: yqlin
 * @Date: 2020/11/26 00:32
 * @Description:
 * @Version: 1.0.0
 */
public class TreeUtilBeta {
    public static Menu toTree(List<Menu> list, Menu rootNode) {
        HashMap<String, Menu> map = new HashMap<>(2);
        map.put(rootNode.getId(), rootNode);
        for (Menu childNode : list) {
            map.put(childNode.getId(), childNode);
            //父节点id
            String pId = childNode.getPid();
            //父节点
            Menu parentNode = map.get(pId);
            //给父节点的child属性赋当前节点
            parentNode.getChild().add(childNode);
        }
        return map.get(rootNode.getId());
    }


    public static List<Menu> toTreeList(List<Menu> list, String pid) {
        Map<String, Menu> map = new HashMap<>(2);
        // 用来存放根节点
        List<Menu> rootNodes = new ArrayList<>();
        for (Menu menu : list) {
            // 如果是父
            if (menu.getPid().equals(pid)) {
                rootNodes.add(menu);
                map.put(pid, menu);
            }
        }
        for (Menu childNode : list) {
            if (childNode != null) {
                map.put(childNode.getId(), childNode);
                if (!childNode.getPid().equals(pid)) {
                    //父节点id
                    String pId = childNode.getPid();
                    //父节点
                    Menu parentNode = map.get(pId);
                    //给父节点的child属性赋当前节点
                    parentNode.getChild().add(childNode);
                }
            }
        }
        return rootNodes;
    }


    public static void main(String[] args) {
//        testToTreeList();
        testToTree();
    }

    private static void testToTree() {
        List<Menu> menus = new ArrayList<>();
        menus.add(new Menu("1", "系统管理", "0"));
        menus.add(new Menu("2", "用户管理", "1"));
        menus.add(new Menu("3", "角色管理", "1"));
        menus.add(new Menu("4", "订单管理", "0"));
        menus.add(new Menu("5", "消费管理", "4"));
        menus.add(new Menu("6", "日志管理", "4"));
        System.out.println("原始数据: ");
        menus.forEach(treeSource -> {
            System.out.println(JSONObject.toJSONString(treeSource));
        });
        Menu root = new Menu("0", "顶级目录", "-1");
        long startTime = System.currentTimeMillis(); //获取开始时间
        root = TreeUtilBeta.toTree(menus, root);
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间：" + (endTime - startTime) + "ms"); //输出程序运行时间
        System.out.println("转换的树形数据: ");
        System.out.println(JSON.toJSONString(root) + "\n");
    }


    private static void testToTreeList() {
        List<Menu> menus = new ArrayList<>();
        menus.add(new Menu("0", "顶级目录", "-1"));
        menus.add(new Menu("1", "系统管理", "0"));
        menus.add(new Menu("2", "用户管理", "1"));
        menus.add(new Menu("3", "角色管理", "1"));
        menus.add(new Menu("4", "订单管理", "0"));
        menus.add(new Menu("5", "消费管理", "4"));
        menus.add(new Menu("6", "日志管理", "4"));
        System.out.println("原始数据: ");
        menus.forEach(treeSource -> {
            System.out.println(JSONObject.toJSONString(treeSource));
        });

        long startTime = System.currentTimeMillis(); //获取开始时间
        List<Menu> toTreeList = TreeUtilBeta.toTreeList(menus, "-1");
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间：" + (endTime - startTime) + "ms"); //输出程序运行时间
        System.out.println("转换的树形数据: ");
        System.out.println(JSON.toJSONString(toTreeList) + "\n");
    }


}
